package builder

import (
	"mi/compiler/ast"
	"mi/compiler/diagnostic"
)

type BuildResult struct {
	Diagnostics []*diagnostic.Diagnostic
}

func Build(projects *ast.ProjectFile, run bool) BuildResult {
	var result BuildResult
	if diag := buildProject(projects, run); diag != nil {
		result.Diagnostics = append(result.Diagnostics, diag)
	}
	return result
}

//func removeContents(dir string) error {
//	d, err := os.Open(dir)
//	if err != nil {
//		return err
//	}
//	defer d.Close()
//	names, err := d.Readdirnames(-1)
//	if err != nil {
//		return err
//	}
//	for _, name := range names {
//		err = os.RemoveAll(filepath.Join(dir, name))
//		if err != nil {
//			return err
//		}
//	}
//	return nil
//}
//
//func cleanFolder(dir string) *diagnostic.Diagnostic {
//	// Make sure the output folder exists and is clean
//	_, err := os.Stat(dir)
//	if err != nil {
//		// The folder does not exist, we create one
//		if os.IsNotExist(err) {
//			err = os.MkdirAll(dir, os.ModePerm)
//			if err != nil {
//				return diagnostic.CreateCompilerDiagnostic(
//					diagnostic.M_Failed_to_create_folder_0_colon_1, dir, err.Error())
//			}
//		} else {
//			return diagnostic.CreateCompilerDiagnostic(
//				diagnostic.M_Failed_to_obtain_file_0_information_colon_1, dir, err.Error())
//		}
//	} else {
//		// Clear the contents of output folder
//		err = removeContents(dir)
//		if err != nil {
//			return diagnostic.CreateCompilerDiagnostic(
//				diagnostic.M_0_error_Colon_1, "removeContents", err.Error())
//		}
//	}
//
//	return nil
//}
//
//func getDirList(path string) ([]string, error) {
//	var result []string
//	fs, err := ioutil.ReadDir(path)
//	if err != nil {
//		return nil, err
//	}
//	for _,file := range fs{
//		if file.IsDir(){
//			var dir = filepath.Join(path, file.Name())
//			result = append(result, dir)
//			dirs, err := getDirList(dir)
//			if err != nil {
//				return nil, err
//			}
//			result = append(result, dirs...)
//		}
//	}
//	return result, nil
//}
//
//func getRelPathList(base string, paths []string) ([]string, error) {
//	var result []string
//	for _, path := range paths {
//		res, err := filepath.Rel(base, path)
//		if err != nil {
//			return nil, err
//		}
//		result = append(result, fmt.Sprintf(".%c%s", filepath.Separator, res))
//	}
//	return result, nil
//}
//
//func addDorJavaSuffix(paths []string) []string{
//	var result []string
//	for _, path := range paths {
//		result = append(result, filepath.Join(path, "*.java"))
//	}
//	return result
//}
//
//func buildClasses(project *ast.ProjectFile) *diagnostic.Diagnostic {
//	var baseDir = project.OutputPath
//	var javaSourceDir = filepath.Join(baseDir, "java")
//
//	// Walk All Dir
//	dirs, err := getDirList(javaSourceDir)
//	dirs = append(dirs, javaSourceDir)
//	if err != nil {
//		return diagnostic.CreateCompilerDiagnostic(
//			diagnostic.M_0_error_Colon_1, "getDirList", err.Error())
//	}
//	relDirs, err := getRelPathList(baseDir, dirs)
//	if err != nil {
//		return diagnostic.CreateCompilerDiagnostic(
//			diagnostic.M_0_error_Colon_1, "getRelPathList", err.Error())
//	}
//
//	if diag := cleanFolder(filepath.Join(baseDir, "classes")); diag != nil {
//		return diag
//	}
//
//	var javaFileDirs = addDorJavaSuffix(relDirs)
//	var javaHome = os.Getenv("JAVA_HOME")
//	var javacPath = filepath.Join(javaHome, "bin", "javac.exe")
//	// Determine whether javac exists
//	_, err = os.Stat(javacPath)
//	if err != nil {
//		return diagnostic.CreateCompilerDiagnostic(
//			diagnostic.M_File_0_does_not_exist_colon_1, javacPath, err.Error())
//	}
//
//	var cmd = exec.Command(javacPath) // "-encoding", "utf8", javaFileDirs...
//	cmd.Args = append(cmd.Args, "-encoding")
//	cmd.Args = append(cmd.Args, "utf8")
//	cmd.Args = append(cmd.Args, javaFileDirs ...)
//	cmd.Args = append(cmd.Args, "-d")
//	cmd.Args = append(cmd.Args, "classes")
//	cmd.Dir = baseDir
//	cmd.Stdout = os.Stdout
//	cmd.Stderr = os.Stdout
//	err = cmd.Run()
//	if err != nil {
//		fmt.Println("错误信息:")
//		fmt.Errorf(err.Error())
//		return diagnostic.CreateCompilerDiagnostic(
//			diagnostic.M_Build_error_colon_0, err.Error())
//	}
//
//	return nil
//}
//
//func buildJar(project *ast.ProjectFile) *diagnostic.Diagnostic {
//	var baseDir = project.OutputPath
//	var jarDir = filepath.Join(baseDir, "jar")
//
//	// Create jar dir
//	if diag := cleanFolder(filepath.Join(baseDir, "jar")); diag != nil {
//		return diag
//	}
//
//	// Build MANIFEST
//	var manifestPath = filepath.Join(jarDir, "MANIFEST.MF")
//	var writer = bytes.Buffer{}
//	writer.WriteString("Manifest-Version: 1.0 \n")
//	writer.WriteString("Created-By: WenYF \n")
//	writer.WriteString("Main-Class: 启动 \n")
//	var err = ioutil.WriteFile(manifestPath, writer.Bytes(), os.ModePerm)
//	if err != nil {
//		return diagnostic.CreateCompilerDiagnostic(
//			diagnostic.M_0_error_Colon_1, "writeFile", err.Error())
//	}
//
//	var javaHome = os.Getenv("JAVA_HOME")
//	var jarExePath = filepath.Join(javaHome, "bin", "jar.exe")
//	// Determine whether jar exe exists
//	_, err = os.Stat(jarExePath)
//	if err != nil {
//		return diagnostic.CreateCompilerDiagnostic(
//			diagnostic.M_File_0_does_not_exist_colon_1, jarExePath, err.Error())
//	}
//
//	var cmd = exec.Command(jarExePath)
//	cmd.Args = append(cmd.Args, "-cvfm")
//	cmd.Args = append(cmd.Args, "./jar/main.jar")
//	cmd.Args = append(cmd.Args, "./jar/MANIFEST.MF")
//	cmd.Args = append(cmd.Args, "-C")
//	cmd.Args = append(cmd.Args, "./classes")
//	cmd.Args = append(cmd.Args, ".")
//	cmd.Dir = baseDir
//	cmd.Stdout = os.Stdout
//	cmd.Stderr = os.Stdout
//	err = cmd.Run()
//	if err != nil {
//		fmt.Println("错误信息:")
//		fmt.Errorf(err.Error())
//		return diagnostic.CreateCompilerDiagnostic(
//			diagnostic.M_Build_error_colon_0, err.Error())
//	}
//
//	return nil
//}
//
//func runProject(project *ast.ProjectFile) *diagnostic.Diagnostic {
//	var baseDir = project.OutputPath
//	var javaHome = os.Getenv("JAVA_HOME")
//	var cmd = exec.Command(filepath.Join(javaHome, "bin", "java.exe"))
//	cmd.Args = append(cmd.Args, "-jar")
//	cmd.Args = append(cmd.Args, "./jar/main.jar")
//	cmd.Dir = baseDir
//	cmd.Stdout = os.Stdout
//	cmd.Stderr = os.Stdout
//	fmt.Println("开始运行:")
//	var err = cmd.Run()
//	if err != nil {
//		fmt.Errorf(err.Error())
//		return diagnostic.CreateCompilerDiagnostic(
//			diagnostic.M_error_Colon_0, err.Error())
//	}
//	return nil
//}
//
//func buildProject(project *ast.ProjectFile, run bool) *diagnostic.Diagnostic {
//	if len(os.Getenv("JAVA_HOME")) == 0 {
//		return diagnostic.CreateCompilerDiagnostic(
//			diagnostic.M_Environment_variables_0_are_not_set, "JAVA_HOME")
//	}
//
//	if diag := buildClasses(project); diag != nil {
//		return diag
//	}
//	if diag := buildJar(project); diag != nil {
//		return diag
//	}
//	if run {
//		if diag := runProject(project); diag != nil {
//			return diag
//		}
//	}
//
//	return nil
//}